package ui;



import java.awt.BorderLayout;
import java.awt.Color;
import logica.*;

import javax.security.auth.callback.ConfirmationCallback;
import javax.swing.JPanel;
import javax.swing.JFrame;


import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.JTable;
import javax.swing.JSplitPane;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.JToolBar;
import javax.swing.JMenuItem;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JProgressBar;
import java.awt.Dimension;
import java.awt.ComponentOrientation;
import java.awt.Point;
import javax.swing.WindowConstants;



 
/*
 * COSAS PENDIENTES * 
 * 
 * 
 * - implementar la funcionalidad de guardar en un archivo --- 
 * - implementar la funcionalidad de levantar un archivo y cargar el arbol 
 * - comprimir el archivo dps de guardarlo con el algoritmos de huffman 
 * - descomprimir el archivo antes de levantarlo con el algoritmos de huffman 
 */


public class Kta extends JFrame implements ActionListener, MouseListener{

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JTextField barraEstado = null;
	private JMenuBar jJMenuBar = null;
	private JMenu archivo = null;
	private JSplitPane jSplitPane = null;
	private JScrollPane jScrollPane = null;
	private JScrollPane jScrollPane1 = null;
	private JTree jTree = null;
	private JTable jTable = null;
	private Ntree raizArbol;  //  @jve:decl-index=0:
	private DefaultTreeModel modeloArbol;
	private JMenu edicion = null;
	private JToolBar jJToolBarBar = null;
	private JButton boton1 = null;
	private JButton boton2 = null;
	private JMenu ver = null;
	private JMenu opciones = null;
	private JMenu ayuda = null;
	private JMenuItem nuevo = null;
	private JMenuItem abrir = null;
	private JMenuItem guardar = null;
	private JMenuItem guardarcomo = null;
	private JMenuItem salir = null;
	private JTextField barraDirecciones = null;
	private String nombreBaseDatosActual;
	private JProgressBar jProgressBar = null;

	/**
	 * This is the default constructor
	 */
	public Kta() {
		super();
		
		initialize();
	}
	
	@Override
	protected void finalize() throws Throwable {
		raizArbol=null;
		super.finalize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		/*
		MyFile archivo1=new MyFile(this.nuevoDisco());		
		MyFile archivo2=new MyFile(this.nuevoDisco());	
		MyFile archivo3=new MyFile(this.nuevoDisco());	
		*/
		this.nombreBaseDatosActual="New DataBase";
		this.raizArbol = new Ntree(this.nombreBaseDatosActual,this);		
		
		/*
		this.raizArbol.addSubFile(archivo1);
		this.raizArbol.addSubFile(archivo2);
		this.raizArbol.addSubFile(archivo3);
		*/
		
		raizArbol.setAllowsChildren(true);		
		this.setSize(747, 499);
		this.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
		this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/img/pappo.jpg")));
		this.setJMenuBar(getJJMenuBar());
		this.setContentPane(getJContentPane());
		this.setTitle("K-Taloga Disk Manager v1.0");
		
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getBarraEstado(), BorderLayout.SOUTH);
			jContentPane.add(getJSplitPane(), BorderLayout.CENTER);
			jContentPane.add(getJJToolBarBar(), BorderLayout.NORTH);
			
			
		}
		return jContentPane;
	}

	/**
	 * This method initializes barraEstado	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getBarraEstado() {
		if (barraEstado == null) {
			barraEstado = new JTextField();
			barraEstado.setText("estado");
			barraEstado.setEditable(false);
		}
		return barraEstado;
	}

	/**
	 * This method initializes jJMenuBar	
	 * 	
	 * @return javax.swing.JMenuBar	
	 */
	private JMenuBar getJJMenuBar() {
		if (jJMenuBar == null) {
			jJMenuBar = new JMenuBar();
			jJMenuBar.add(getArchivo());
			jJMenuBar.add(getEdicion());
			jJMenuBar.add(getVer());
			jJMenuBar.add(getOpciones());
			jJMenuBar.add(getAyuda());
			
		}
		return jJMenuBar;
	}

	/**
	 * This method initializes archivo	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getArchivo() {
		if (archivo == null) {
			archivo = new JMenu();
			archivo.setText("Archivo");
			archivo.add(getNuevo());
			archivo.add(getAbrir());
			archivo.add(getGuardar());
			archivo.add(getGuardarcomo());
			archivo.add(getSalir());		
		}
		return archivo;
	}

	/**
	 * This method initializes jSplitPane	
	 * 	
	 * @return javax.swing.JSplitPane	
	 */
	private JSplitPane getJSplitPane() {
		if (jSplitPane == null) {
			jSplitPane = new JSplitPane();
			jSplitPane.setDividerLocation(150);
			jSplitPane.setLeftComponent(getJScrollPane());
			jSplitPane.setRightComponent(getJScrollPane1());
		}
		return jSplitPane;
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setViewportView(getJTree());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jScrollPane1	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane1() {
		if (jScrollPane1 == null) {
			jScrollPane1 = new JScrollPane();
			jScrollPane1.setViewportView(getJTable());			
		}
		return jScrollPane1;
	}

	/**
	 * This method initializes jTree	
	 * 	
	 * @return javax.swing.JTree	
	 */
	private JTree getJTree() {
		modeloArbol = new DefaultTreeModel(raizArbol);					
		if (jTree == null) {			
			jTree = new JTree();
			jTree.setBackground(Color.white);
			jTree.setModel(modeloArbol);
			jTree.addMouseListener(this);
			
			//barraEstado.setText(String.valueOf(arbol.getRowCount())+" item(s)");
		
			
			// Nos suscribimos a la seleccion de un nodo en el arbol.
			/*
			jTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
			
				public void valueChanged(TreeSelectionEvent e) {
					
					// Obtenemos y escribimos en pantalla  el path seleccionado
					TreePath path = e.getPath();
					Object [] nodos = path.getPath();
					//System.out.print("Path seleccionado: ");
					
					Ntree buscado = arbol.traer(nodos, 0);
					jTable.setModel(buscado);
					
					barraEstado.setText(String.valueOf(buscado.getRowCount())+
							" item(s)");
														
				}			
			});		*/	
		}
		return jTree;
	}

	/**
	 * This method initializes jTable	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTable() {
		if (jTable == null) {				
			jTable = new JTable();	
			jTable.setShowVerticalLines(true);		
			jTable.setShowHorizontalLines(false);
			jTable.setModel(raizArbol);			
			jTable.addMouseListener(this);
			
		}
		return jTable;
	}

	/**
	 * This method initializes edicion	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getEdicion() {
		if (edicion == null) {
			edicion = new JMenu();
			edicion.setText("Edicion");
			
		}
		return edicion;
	}

	/**
	 * This method initializes jJToolBarBar	
	 * 	
	 * @return javax.swing.JToolBar	
	 */
	private JToolBar getJJToolBarBar() {
		if (jJToolBarBar == null) {
			jJToolBarBar = new JToolBar();
			jJToolBarBar.setFloatable(false);
			jJToolBarBar.add(getBoton1());
			jJToolBarBar.add(getBoton2());
			jJToolBarBar.add(getBarraDirecciones());
			jJToolBarBar.add(getJProgressBar());
		}
		return jJToolBarBar;
	}

	/**
	 * This method initializes boton1	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBoton1() {
		if (boton1 == null) {
			boton1 = new JButton();
			boton1.setText("nuevoDisco");
			boton1.addActionListener(this);
			
		
		}
		return boton1;
	}

	/**
	 * This method initializes boton2	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBoton2() {
		if (boton2 == null) {
			boton2 = new JButton();
			boton2.setText("boton2");
			boton2.addActionListener(this);
		}
		return boton2;
	}

	/**
	 * This method initializes ver	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getVer() {
		if (ver == null) {
			ver = new JMenu();
			ver.setText("Ver");
			
		}
		return ver;
	}

	/**
	 * This method initializes opciones	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getOpciones() {
		if (opciones == null) {
			opciones = new JMenu();
			opciones.setText("Opciones");
			
		}
		return opciones;
	}

	/**
	 * This method initializes ayuda	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getAyuda() {
		if (ayuda == null) {
			ayuda = new JMenu();
			ayuda.setText("Ayuda");
			
		}
		return ayuda;
	}

	/**
	 * This method initializes nuevo	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getNuevo() {
		if (nuevo == null) {
			nuevo = new JMenuItem();
			nuevo.setText("Nueva DB");
			nuevo.addActionListener(this);
		}
		return nuevo;
	}

	/**
	 * This method initializes abrir	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getAbrir() {
		if (abrir == null) {
			abrir = new JMenuItem();
			abrir.setText("Abrir");
			abrir.addActionListener(this);
		}
		return abrir;
	}

	/**
	 * This method initializes guardar	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getGuardar() {
		if (guardar == null) {
			guardar = new JMenuItem();
			guardar.setText("Guardar");
			guardar.addActionListener(this);
		}
		return guardar;
	}

	/**
	 * This method initializes guardarcomo	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getGuardarcomo() {
		if (guardarcomo == null) {
			guardarcomo = new JMenuItem();
			guardarcomo.setText("Guardar como ...");
			guardarcomo.addActionListener(this);
		}
		return guardarcomo;
	}

	/**
	 * This method initializes salir	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getSalir() {
		if (salir == null) {
			salir = new JMenuItem();
			salir.setText("Salir");
			salir.addActionListener(this);
		}
		return salir;
	}
	public void setEstado(String e){
		this.barraEstado.setText(e);
	}

	/**
	 * This method initializes barraDirecciones	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getBarraDirecciones() {
		if (barraDirecciones == null) {
			barraDirecciones = new JTextField();
			barraDirecciones.setEditable(false);			
		}
		return barraDirecciones;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		resetBarraEstadoYBarraProgreso();
		
		try{
			// ************** AGREGAR UN CD O DVD **************
			if(e.getSource().equals(boton1)){
				
				// ------------------------------------------------------------------------------
				/*	funcionalidad para usar la clase add y el dto  que 
					no esta terminada	*/
				/*
				System.out.println("boton1");
				DtoAdd nuevo = new DtoAdd();
				Add temp = new Add(this,nuevo);			*/			
				//--------------------------------------------------------------------------------
				
				File tmp= this.nuevoDisco();
				
				/*	- que el usuario no cancelo,
					- que se selecciono un directorio
					- y que el directorio seleccionado no este vacio	*/			
				if(tmp!=null && tmp.isDirectory() && (0!=tmp.listFiles().length)){
					
					this.raizArbol.addSubFile(new MyFile(tmp, this));
					modeloArbol = new DefaultTreeModel(raizArbol);	
					jTree.setModel(modeloArbol);
				
				}
				else{
					throw new Errores(this,1);
				}
				
				//this.raizArbol.

				
			}
			
			// no tiene funcionalidad aun
			else if(e.getSource().equals(boton2)){
				System.out.println("boton2");
			}
			// sale del programa
			else if(e.getSource().equals(this.salir)){
				int s=JOptionPane.showConfirmDialog(this, "Realmente Desea Salir de K-taloga?");
				if(s==0){
					System.exit(0);
				}			
			}
			
			
			// ************** NUEVA BASE DE DATOS **************
			else if(e.getSource().equals(this.nuevo)){	
				
				System.out.println("crea nueva BD"); 
				int s=JOptionPane.showConfirmDialog(this, "desea guardar la base de datos actual");
				
				if(s==ConfirmationCallback.YES){ 
					this.raizArbol.saveDB(this,this.nombreBaseDatosActual,this.jProgressBar);
					String nuevaBaseDatos = JOptionPane.showInputDialog(this,"ingrese nombre de la nueva base de datos: ","new DataBase");
					this.nuevaDataBase(nuevaBaseDatos);
					
				}
				
				else if(s==ConfirmationCallback.NO){ 
					String nuevaBaseDatos = JOptionPane.showInputDialog(this,"ingrese nombre de la nueva base de datos: ","new DataBase");
					this.nuevaDataBase(nuevaBaseDatos);
					
				}
				
				else if(s==ConfirmationCallback.CANCEL) {
					
				}
				
			}
			
			// ************** GUARDAR **************
			else if(e.getSource().equals(this.guardar)){	
				
				this.raizArbol.saveDB(this,this.nombreBaseDatosActual,this.jProgressBar);			
										
			}
			
			// ************** GUARDAR COMO **************
			else if(e.getSource().equals(this.guardarcomo)){			
				 
				this.raizArbol.saveDB(this,this.nombreBaseDatosActual,this.jProgressBar);
							
			}
			
			// ************** ABRIR BASE DATOS EXISTENTE **************
			else if(e.getSource().equals(this.abrir)){
				
				//this.raizArbol.addSubFile(new MyFile(tmp, this));
				Ntree nuevo = raizArbol.openDB(this);
				modeloArbol = new DefaultTreeModel(nuevo);	
				jTree.setModel(modeloArbol);
				
				/*
				this.raizArbol.addSubFile(new MyFile(tmp, this));
				
				raizArbol.openDB(this);
				Ntree temp = new Ntree("dac",this);
				raizArbol=temp;
				modeloArbol = new DefaultTreeModel(raizArbol);	
				jTree.setModel(modeloArbol);*/
		
			}
			
		}
		catch(Errores er){
			er.showMessage();
		}
		
		
	}
	
	/**
	 * metodo que crea una nueva base de datos con un nombre nuevo
	 * @param nombre
	 * @author francisco
	 */	
	private void nuevaDataBase(String nombre) {
		this.nombreBaseDatosActual=nombre;
		raizArbol = new Ntree(nombre, this);
		DefaultTreeModel nuevoModeloArbol = new DefaultTreeModel(raizArbol);	
		jTree.setModel(nuevoModeloArbol);
		
	}

	private File nuevoDisco(){		
	
		JFileChooser selectorArchivo = new JFileChooser();
		selectorArchivo.isDirectorySelectionEnabled();
	    selectorArchivo.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
	    int resultado = selectorArchivo.showOpenDialog(this);
	    File a = selectorArchivo.getSelectedFile();
	    
	    if (resultado!=-1){
	    	return a;
	    }
	    return null;
	    
	    //return new File("C:\\Users\\Dieguez\\Documents\\Mis escaneos");
	}

	/**
	 * This method initializes jProgressBar	
	 * 	
	 * @return javax.swing.JProgressBar	
	 */
	private JProgressBar getJProgressBar() {
		if (jProgressBar == null) {
			jProgressBar = new JProgressBar();
			jProgressBar.setStringPainted(true);
			jProgressBar.setSize(new Dimension(100, 20));
			jProgressBar.setComponentOrientation(ComponentOrientation.UNKNOWN);
			jProgressBar.setLocation(new Point(588, 4));
			jProgressBar.setPreferredSize(new Dimension(100, 20));
			jProgressBar.setString("");
		}
		return jProgressBar;
	}
	
	public JTextField barraEstado(){
		return this.barraEstado;
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		resetBarraEstadoYBarraProgreso();
		
		if(e.getSource().equals(this.jTree)){
			if(jTree.getSelectionPath()!=null){
				System.out.println("mouseClicked() "+jTree.getSelectionPath());
				
				TreePath path = jTree.getSelectionPath();
				Object [] nodos = path.getPath();
				//System.out.print("Path seleccionado: ");
				if(nodos.length!=0){
					barraDirecciones.setText(jTree.getSelectionPath().toString());
				}
				Ntree buscado = null;
				try {
					buscado = raizArbol.traer(nodos, 0);
				} catch (Errores e1) {
					
					e1.printStackTrace();
				}
				jTable.setModel(buscado);						
				barraEstado.setText(String.valueOf(buscado.getRowCount())+" item(s)"
						+"		Fecha de Lectura: "
						+buscado.getFecha());						
			}
		}
		else if(e.getSource().equals(this.jTable)){
			int fila=jTable.getSelectedRow();
			if(e.getClickCount()==2){
				
				int hijo = jTable.getSelectedRow();						
				Ntree hijoSeleccionado = null;
				try {
					hijoSeleccionado = ((Ntree) jTable.getModel()).getNtreeAt(hijo);
				} catch (Errores e1) {
					
					e1.printStackTrace();
				}						
				
				if(!hijoSeleccionado.isLeaf()){ // si es una carpeta						
				
				TreePath path = jTree.getSelectionPath();
				Object [] nodos = path.getPath();
				//System.out.print("Path seleccionado: ");
				if(nodos.length!=0){
					barraDirecciones.setText(jTree.getSelectionPath().toString());
				}
				//Ntree buscado = arbol.traer(nodos, 0);
				//Ntree nuevo = (Ntree) buscado.getChildAt(hijo);
				jTable.setModel(hijoSeleccionado);
				
			
				barraEstado.setText(String.valueOf(hijoSeleccionado.getRowCount())+" item(s)");		
				
				}
				
				System.out.println(jTree.getSelectionPath().toString());
			
				
				//Object nodos [] = {((Ntree) jTable.getModel()).getNtreeAt(fila)};
				//Ntree buscado = arbol.traer(nodos, 0);
				//System.out.println("se encontro el "+buscado.getNombre());
				//jTable.setModel(buscado);						
				//barraEstado.setText(String.valueOf(buscado.getRowCount())+" item(s)");	
				
			}
			else{
				
				try {
					System.out.println(((Ntree) jTable.getModel()).getNtreeAt(fila).getNombre());
				} catch (Errores e1) {
					
					e1.printStackTrace();
				}
			}
		}
	
		
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	private void resetBarraEstadoYBarraProgreso(){
		this.barraEstado.setBackground(new Color(238,238,238));
		this.barraEstado.setText("");
		this.jProgressBar.setValue(0);
		this.jProgressBar.setString("");	
	}

}  //  @jve:decl-index=0:visual-constraint="10,10"
